//
// Package utils config.go 配置文件操作相关函数
//
package utils

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

// 存放配置信息
var configMappings map[string]string

// InitConfigs 初始化配置文件信息
func InitConfigs(configPath string) (err error) {
	// 获取绝对路径
	configPath, err = filepath.Abs(configPath)
	if err != nil {
		return fmt.Errorf("无效的配置文件路径:%s,error:%s", configPath, err)
	}
	configMappings = make(map[string]string)
	// 读取configPath下所有的json文件
	err = filepath.Walk(configPath, func(path string, fs os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !fs.IsDir() {
			if strings.HasSuffix(fs.Name(), "json") {
				bytes, err := ioutil.ReadFile(path)
				if err != nil {
					return fmt.Errorf("读取文件错误:%s,error:%s", path, err)
				}
				// str, err := Discard(string(bytes))
				// if err != nil {
				// 	return fmt.Errorf("处理文件注释失败:%s,error:%s", path, err)
				// }
				// 序列化
				var tmp = map[string]string{}
				// err = json.Unmarshal([]byte(str), &tmp)
				err = json.Unmarshal(bytes, &tmp)
				if err != nil {
					return fmt.Errorf("文件内容序列化失败:%s,error:%s", path, err)
				}
				// 存储到全局变量
				for key, value := range tmp {
					configMappings[key] = value
				}
			}
		}
		return nil
	})
	if err != nil {
		return fmt.Errorf("读取目录错误:%s,error:%s", configPath, err)
	}
	return nil
}

// GetConfigValue 根据配置键读取配置值
func GetConfigValue(key string) string {
	return configMappings[key]
}

// Map alias map[string]string
type Map map[string]string

// Maches Discard from "start" to "end"
var Maches = []Map{
	Map{"start": "//", "end": "\n"},
	Map{"start": "/*", "end": "*/"},
}

// Discard 处理json文件中的注释
func Discard(content string) (string, error) {
	var (
		buffer    bytes.Buffer
		flag      int
		v         rune
		protected bool
	)
	runes := []rune(content)
	flag = -1
	for i := 0; i < len(runes); {
		v = runes[i]
		if flag == -1 {
			// match start
			for f, v := range Maches {
				l := match(&runes, i, v["start"])
				if l != 0 {
					flag = f
					i += l
					break
				}
			}
			if flag == -1 {
				if protected {
					buffer.WriteRune(v)
					if v == '"' {
						protected = true
					}
				} else {
					r := filter(v)
					if r != 0 {
						buffer.WriteRune(v)
					}
				}
			} else {
				continue
			}
		} else {
			// match end
			l := match(&runes, i, Maches[flag]["end"])
			if l != 0 {
				flag = -1
				i += l
				continue
			}
		}
		i++
	}
	return buffer.String(), nil
}

func filter(v rune) rune {
	switch v {
	case ' ':
	case '\n':
	case '\t':
	default:
		return v
	}
	return 0
}

func match(runes *[]rune, i int, dst string) int {
	dstLen := len([]rune(dst))
	if len(*runes)-i >= dstLen && string((*runes)[i:i+dstLen]) == dst {
		return dstLen
	}
	return 0
}

// SystemAdminList 系统管理员列表
var SystemAdminList []string

// InitSystemAdminList 初始化系统管理员列表 ;分隔
func InitSystemAdminList(systemAdminList string) {
	SystemAdminList = strings.Split(systemAdminList, ";")
}
